package com.bruce.demo2.patterns.demo1.creational.demo01.singleton.demo09;

import java.io.Serializable;

/**
 * @PROJECT_NAME design_patterns
 * @DESCRIPTION 序列化可破坏单例模式及解决方案
 * 在单例类中添加readResolve()方法，在反序列化时被反射调用，如果定义了这个方法，就返回这个方法的值，如果没有定义，则返回新new出来的对象
 * @AUTHOR CNBruceLee
 * @DATE 2021/7/8 19:51
 */
public class Singleton implements Serializable {
    //1、私有化构造方法
    private Singleton() {
    }

    //2、定义内部类中生成实例
    private static class SingletonInner {
        public static final Singleton INSTANCE = new Singleton();
    }

    //3、对外提供实例的获取方法
    public static Singleton getInstance() {
        return SingletonInner.INSTANCE;
    }

    //反序列化时，反射生产对象会检查是否有readResolve方法，有则执行readResolve方法，没有则new一个新对象，所以此处添加此方法返回已有实例
    public Object readResolve() {
        return SingletonInner.INSTANCE;
    }
}
